package no.ciber.kartdemo.facebook.client;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import no.ciber.kartdemo.googlemaps.Lokasjon;
import no.ciber.kartdemo.googlemaps.LokasjonService;

import com.google.code.facebookapi.ProfileField;
import com.google.code.facebookapi.schema.FriendsGetResponse;
import com.google.code.facebookapi.schema.Location;
import com.google.code.facebookapi.schema.User;
import com.google.code.facebookapi.schema.UsersGetInfoResponse;

public class FacebookUserService {

	public List<User> hentVenneliste() {
		List<User> venneliste = hentFiltrertVenneliste();
		leggPaaPosisjonerPaaUser(venneliste);
		return venneliste;
	}

	private void leggPaaPosisjonerPaaUser(List<User> venneliste) {
		LokasjonService lokasjonfinner = new LokasjonService();
		for (User user : venneliste) {
			Lokasjon lokasjon = lokasjonfinner.hentLokasjon(getBy(user));
			lokasjon = forskyvPosisjonMedOpptilEnKm(lokasjon);
			user.getCurrentLocation().setLatitude(lokasjon.getForskjovetLatitude());
			user.getCurrentLocation().setLongitude(lokasjon.getForskjovetLongitude());
			user.getCurrentLocation().setCity(getBy(user));
		}
	}

	Lokasjon forskyvPosisjonMedOpptilEnKm(Lokasjon lokasjon) {
		return lokasjon;
	}

	String getBy(User user) {
		if (currentLocationHarBy(user)) {
			return user.getCurrentLocation().getCity();
		} else if (hometownLocationHarBy(user)) {
			return user.getHometownLocation().getCity();
		}
		return "Kautokeino";
	}

	private boolean hometownLocationHarBy(User user) {
		return user.getHometownLocation() != null && user.getHometownLocation().getCity() != null && !user.getHometownLocation().getCity().isEmpty();
	}

	private boolean currentLocationHarBy(User user) {
		return user.getCurrentLocation() != null && user.getCurrentLocation().getCity() != null && !user.getCurrentLocation().getCity().isEmpty();
	}

	private List<User> hentFiltrertVenneliste() {
		try {
			FriendsGetResponse friends = (FriendsGetResponse) FacebookClientHelper.getFacebookClient().friends_get();
			UsersGetInfoResponse friendsInfo = (UsersGetInfoResponse) FacebookClientHelper.getFacebookClient().users_getInfo(friends.getUid(),
					setupBasicInfofelt());

			List<User> friendInfoList = friendsInfo.getUser();
			FacebookUsersFilter filter = new FacebookUsersFilter();
			Collection<User> filtrerteBrukere = filter.filtrerKjonn(friendInfoList);
			sorgForAtAlleHarCurrentLocation(filtrerteBrukere);
			return new ArrayList<User>(filtrerteBrukere);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private void sorgForAtAlleHarCurrentLocation(Collection<User> filtrerteBrukere) {
		for (User user : filtrerteBrukere) {
			if (user.getCurrentLocation() == null) {
				user.setCurrentLocation(new Location());
			}
		}
	}

	private Collection<ProfileField> setupBasicInfofelt() {
		Set<ProfileField> fields = new HashSet<ProfileField>();
		fields.add(ProfileField.FIRST_NAME);
		fields.add(ProfileField.LAST_NAME);
		fields.add(ProfileField.SEX);
		fields.add(ProfileField.HOMETOWN_LOCATION);
		fields.add(ProfileField.CURRENT_LOCATION);
		fields.add(ProfileField.RELATIONSHIP_STATUS);
		fields.add(ProfileField.PIC_SMALL);
		fields.add(ProfileField.HS_INFO);

		return fields;
	}
}
